/** 
 * @addtogroup hft
 * hft
 * @brief 鸿泉下线检测协议
 * 
 * 本文件接口提供了下线检测协议数据流的解码接口以及应答消息的编码接口。
 *
 * @code{c}
 * // 获取一段数据流
 * // ....
 * THtpMsg msg;
 * Int32   pop_size, bytes_to_read;
 * UInt8   read_buf[1024];
 * // 获取一段数据流
 * // bytes_to_read = DoReadDataStream(read_buf, sizeof(read_buf));
 * if(HtpFrameDecode(buffer, bytes_to_read, &msg, &pop_size) == kHtpDecodeOk)
 * {
 *  // 解析成功 处理msg
 *  // ...
 * }
 * 
 * // 移动缓存中数据pop_size
 * @endcode
 * 
 * @{
 * @file                hft_proto.h
 * @brief               鸿泉下线检测协议数据流解码和应答消息编码
 * @note                
 * @author              lixinliang
 * @date                2020-01-21
 * @version             1.0
 * 
 * @par                    
 * <table>
 * <tr><th>Date          <th>Version        <th>Author                     <th>Description
 * <tr><td>2020-01-21    <td>1.0            <td>lixinliang@hopechart.com   <td>创建初始版本
 * @copyright            杭州鸿泉物联网技术股份有限公司
 */

#ifndef _HFT_PROTO_H_
#define _HFT_PROTO_H_

#include "ofc/ofc_types.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 协议通用信息枚举
 */
enum 
{
    kHtpHeadFlag     = 0x51, ///< 串口协议消息头标识符
    kHtpMaxAduLength = 1024, ///< 最大协议应用数据单元长度
};

/**
 * 串口命令枚举
 */
enum THtpCmdTag
{
    kHtpCmdGeneralAck       = 0xFF, ///< 通用应答
    kHtpCmdAddressMap       = 0xFE, ///< 物理地址映射
    kHtpCmdPointerAssign    = 0xFD, ///< 指针赋值
    kHtpCmdQuery            = 0xFC, ///< 查询命令
    kHtpCmdControl          = 0xFB, ///< 控制命令
    kHtpCmdCanConfig        = 0xFA, ///< CAN 配置
    kHtpCmdCanDataQuery     = 0xF9, ///< CAN 数据查询
    kHtpCmdPointerQuery     = 0xF8, ///< 指针查询
    kHtpCmdFileXferDesc     = 0xF7, ///< 文件传输描述
    kHtpCmdReqFileSection   = 0xF6, ///< 请求一包文件数据
    kHtpCmdXferFileData     = 0xF5, ///< 传输文件数据
    kHtpCmdXferFileFinish   = 0xF4, ///< 文件传输完成
};
typedef enum THtpCmdTag THtpCmd;

/**
 * 查询类型枚举
 */
enum THtpCmdQueryTypeTag
{
    kHtpQueryDevId = 0,                 ///< 设备号
    kHtpQueryDevMode = 1,               ///< 终端模式
    kHtpQueryDevModel = 2,              ///< 产品型号
    kHtpQueryTestStatus = 3,            ///< 测试状态
    kHtpQueryDevSwitch = 4,             ///< 开关量
    kHtpQueryPluseSpeed = 5,            ///< 脉冲车速
    kHtpQueryPluseRev = 6,              ///< 脉冲转速
    kHtpQueryCanRev = 7,                ///< CAN 转速
    kHtpQueryAD1 = 8,                   ///< 温度 AD1
    kHtpQueryAD2 = 9,                   ///< 油位 AD2
    kHtpQueryDriverCode = 10,           ///< 驾驶员代码
    //kHtpQueryGpsStatus = 11,            ///< GPS 状态，187包含天线测试，根据实际配置选用
    kHtpQueryGprsModule = 12,           ///< 单GPRS 模块
    kHtpQueryRadioNum = 13,             ///< 电台数据
    kHtpQueryDevTime = 14,              ///< 设备时间 time_t
    kHtpQueryLockStatus = 15,           ///< 锁车状态 
    kHtpQueryStatus = 16,               ///< 状态查询 
    kHtpQueryCameraStatus = 17,         ///< 摄像头状态查询 
    //kHtpQueryGpsAntennaStat = 18,       ///< GPS天线状态查询，0:正常 1:异常
    kHtpQueryUartStatus = 19,           ///< 串口状态查询 
    kHtpQueryGbosScreen = 27,           ///< GBOS屏返回状态
    kHtpQueryIcSwipeTimes = 28,         ///< IC卡刷卡次数
    kHtpQueryDevVesion = 29,            ///< 终端烧写版本
    kHtpQueryXyzStatus = 30,            ///< 三轴标定结果
    kHtpQueryGprsQos = 31,              ///< GPRS QOS 通讯模块信号强度统计
    kHtpQueryDevCrashTimes = 32,        ///< 终端崩溃次数
    //kHtpQueryGpsStatus2 = 33,           ///< GPS 状态,187包含，根据实际配置选用
    kHtpQueryGprsModule1 = 34,          ///< GPRS 模块1 注意：对于只有单个Gprs模块的设备使用该项
    kHtpQueryGprsModule2 = 35,          ///< GPRS 模块2 注意：对于只有单个Gprs模块的设备该项不被使用
    
    /// add by tj
    kHtpQueryGpsAverageLocalTime = 36,  ///< GPS模块定位平均时长
    kHtpQueryGprsSignalStrength = 37,   ///< GPRS模块信号强度
    kHtpQueryHqt402 = 38,               ///< HQT402产测项定义
    kHtpQueryHq03 = 39,                 ///< HQ03 标定
    kHtpQueryBluetoothTest = 100,       ///< 蓝牙测试
    kHtpQuerySimSignalStrength = 101,   ///< SIM卡信号强度
    kHtpQuery6108sNetTest = 102,        ///< 6108S 4G网络测试
    kHtpQueryRelayStatus = 103,         ///< 继电器状态
    kHtpQueryWiredNetStatus = 104,      ///< 有线网络状态
    kHtpQuerySecondUDisk = 105,         ///< 第二路U盘
    kHtpQueryFctKeyStatus = 106,        ///< FCT按键状态测试
    kHtpQueryOutput12V = 107,           ///< 终端12V输出
    kHtpQueryMicTest = 108,             ///< MIC测试
    kHtpQueryPrintStatus = 109,         ///< 打印机状态查询 
    //kHtpQueryRelayStatus = 110,         ///< 继电器 与103重复，根据实际配置选用
    kHtpQueryEmergency = 111,           ///< 劫警 
    kHtpQueryAudioStatus = 112,         ///< 音频状态 
    kHtpQueryRecovery = 113,            ///< 灾备 
    kHtpQuerySdCard = 114,              ///< SD 卡功能 
    kHtpQueryInsideBattery = 115,       ///< 内置电池
    kHtpQueryGpsAntennaState = 116,     ///< Gps天线状态，187中包含，根据实际配置选用
    //kHtpQueryHqb202Camera1 = 117,       ///< HQB202摄像头第一路检测，与命令字17功能重复
    //kHtpQueryHqb202Camera2 = 118,       ///< HQB202摄像头第二路检测，与命令字17功能重复
    //kHtpQueryHqb202Camera3 = 119,       ///< HQB202摄像头第三路检测，与命令字17功能重复
    //kHtpQueryHqb202Camera4 = 120,       ///< HQB202摄像头第四路检测，与命令字17功能重复
    kHtpQueryHqb202NetTest = 122,       ///< HQB202网络检测
    kHtpQueryHqb202UsbTest = 123,       ///< HQB202 USB检测
    kHtpQueryHqb202UartTest = 124,      ///< HQB202串口检测
    kHtpQueryHqb202CanTest = 125,       ///< HQB202 CAN检测
    kHtpQueryBgiEncryptionChip = 126,   ///< 华大加密芯片
    kHtpQueryAndroidScreenVideo = 127,  ///< 安卓屏VIDEO按钮
    kHtpQueryAndroidScreenNavi = 128,   ///< 安卓屏NAVI按钮
    kHtpQueryHardDiskLockStatus = 129,  ///< 硬盘锁
    kHtpQueryMassimoAccOff = 130,       ///< MassimoAccOff状态
    kHtpQueryAndroidScreenIc = 131,     ///< 安卓屏IC卡状态
    kHtpQuery360CameraVideoInput = 132, ///< 360摄像头视频输入
    kHtpQuery360ImageOutput = 133,      ///< 360图像输出
    kHtpQuery360UsbTest = 134,          ///< 360USB检测
    kHtpQueryTboxWifiSwitch = 136,      ///< TBOX系列WIFI开关查询
    kHtpQueryTboxWifiTest = 137,        ///< TBOX系列WIFI产测查询
    kHtpQueryTboxBluetoothSwitch = 140, ///< TBOX系列蓝牙开关查询
    kHtpQueryTboxBluetoothTest = 142,   ///< TBOX系列蓝牙产测查询
    kHtpQuerySq3102xFlashTest = 143,    ///< 陕汽3102X型号FLASH校验
    kHtpQueryHqa411Usb = 144,           ///< HQA411 USB判断定义增加
    //kHtpQueryTboxWifiTest = 145,        ///< TBOX系列wifi检测，根据实际配置选用
    kHtpQuery801HardDiskTest = 146,     ///< 801硬盘检测
    kHtpQueryMitouHornTest = 147,       ///< 咪头喇叭检测
    kHtpQueryFreeState = 148,           ///< 空闲
    kHtpQueryMitouAutoTest = 149,       ///< 咪头自动检测
    kHtpQueryKeystroke1 = 150,          ///< 按键1检测
    kHtpQueryKeystroke2 = 151,          ///< 按键2检测
    kHtpQueryKeystroke3 = 152,          ///< 按键3检测
    kHtpQueryKeystroke4 = 153,          ///< 按键4检测
    kHtpQueryKeystroke5 = 154,          ///< 按键5检测
    kHtpQueryKeystroke6 = 155,          ///< 按键6检测
    kHtpQueryV2XTest = 156,             ///< V2X检测
    kHtpQueryMainPowerShutDown = 157,   ///< 主电关断
    kHtpQueryGprsAntennaState = 158,    ///< 查询GPRS天线状态
    kHtpQuerySixAxisStatus = 159,       ///< 六轴状态查询
    kHtpQueryKnob1 = 160,               ///< 旋钮1检测
    kHtpQueryKnob2 = 161,               ///< 旋钮2检测
    kHtpQueryKnob3 = 162,               ///< 旋钮3检测
    kHtpQueryKnob4 = 163,               ///< 旋钮4检测
    kHtpQueryKnob5 = 164,               ///< 旋钮5检测
    kHtpQueryKnob6 = 165,               ///< 旋钮6检测
    kHtpQueryAudioInput = 166,          ///< 音频输入
    //kHtpQueryGpsAntennaState = 167,     ///< 查询gps天线状态，187包含天线测试，根据实际配置选用
    kHtpQuery24VHighSideOutputHigh = 168, ///< 24V高边输出测试（拉高）
    kHtpQuery24VHighSideOutputLow = 169,  ///< 24V高边输出测试（拉低）
    kHtpQueryRtcTest = 170,             ///< RTC检测
    kHtpQueryAndroidScreenAd1 = 171,    ///< 安卓屏第1路AD状态
    kHtpQueryAndroidScreenAd2 = 172,    ///< 安卓屏第2路AD状态
    kHtpQueryAndroidScreenAd3 = 173,    ///< 安卓屏第3路AD状态
    kHtpQueryAndroidScreenAd4 = 174,    ///< 安卓屏第4路AD状态
    kHtpQueryAndroidScreenAd5 = 175,    ///< 安卓屏第5路AD状态
    kHtpQueryAndroidScreenAd6 = 176,    ///< 安卓屏第6路AD状态
    kHtpQueryAndroidScreenAd7 = 177,    ///< 安卓屏第7路AD状态
    kHtpQuerySimCardStatus = 178,       ///< SIM卡状态
    kHtpQueryNetShareStatus = 179,      ///< 网络共享状态
    kHtpQueryTfCardStatus = 180,        ///< TF卡状态
    kHtpQuerySoftwareUpdateFlag = 181,  ///< 软件标记更新
    kHtpQuery12VTest = 182,             ///< 12V检测
    kHtpQueryAhdTest = 183,             ///< AHD检测
    kHtpQueryImuTest = 184,             ///< IMU模块测试
    kHtpQueryFlashStatus = 185,         ///< Flash测试
    kHtpQueryEncryptionChipStatus = 186,  ///< HSM加密芯片测试
    kHtpQueryGpsModuleState = 187,      ///< GPS模块测试
    kHtpQueryHighSideOutputHigh = 188,  ///< 高边输出测试（拉高）
    kHtpQueryHighSideOutputLow = 189,   ///< 高边输出测试（拉低）
    kHtpQueryIcTest = 190,              ///< IC卡检测，返回IC卡成功插入次数
    kHtpQueryWeighAntXaxisAcce = 1091,  ///< 称重蚁X轴加速度传感器
    kHtpQueryWeighAntYaxisAcce = 1092,  ///< 称重蚁Y轴加速度传感器
    kHtpQueryWeighAntZaxisAcce = 1093,  ///< 称重蚁Z轴加速度传感器
    kHtpQueryWeighAntUartStatus = 1094, ///< 称重蚁RS232/RS485状态
    kHtpQueryWeighAntVersion = 1095,    ///< 称重蚁版本信息核对
    kHtpQueryWeighAntTempSensor = 196,  ///< 称重蚁温度传感器
    kHtpQueryWeighAntAd1 = 197,         ///< 称重蚁第1路AD检测
    kHtpQueryWeighAntAd2 = 198,         ///< 称重蚁第2路AD检测
    kHtpQueryWeighAntAd3 = 199,         ///< 称重蚁第3路AD检测
    kHtpQueryWeighAntAd4 = 200,         ///< 称重蚁第4路AD检测
    kHtpQueryWeighAntAd5 = 201,         ///< 称重蚁第5路AD检测
    kHtpQueryWeighAntAd6 = 202,         ///< 称重蚁第6路AD检测
    //kHtpQueryRtcWakeCtrl = 203,         ///< RTC唤醒控制
    kHtpQueryRtcWakeTest = 204,         ///< RTC唤醒检测项查询
    kHtpQuerySmsWakeCtrl = 205,         ///< 短信唤醒控制
    kHtpQuerySmsWakeTest = 206,         ///< 短信唤醒检测项查询
    kHtpQueryMainVoltageValue = 207,    ///< 主电电压检测查询
    kHtpQueryBakVoltageCtrl = 208,      ///< 备电电压检测控制
    kHtpQueryBakVoltageValue = 209,     ///< 备电电压检测查询
    kHtpQuerySpiCtrlStart = 210,        ///< SPI控制开始  
    kHtpQuerySpiTest = 211,             ///< SPI检测
    kHtpQuerySpiCtrlClose = 212,        ///< SPI控制关闭
    kHtpQueryZfdLeftTurnSignal = 213,   ///< ZFD左转信号
    kHtpQueryZfdIcallTest = 214,        ///< ZFD I-CALL检测
    kHtpQuery3dGeomagnetism = 215,      ///< 3D 地磁检测
    kHtpQueryAutomotiveEthernet = 216,  ///< 车载以太网检测
    kHtpQueryTamperProof = 217,         ///< 防拆检测
    kHtpQueryStopMicHandMi = 218,       ///< 停止MIC手咪检测
    kHtpQueryUpAudioInputOpen = 219,    ///< 开启上行音频输入
    kHtpQueryDownAudioOnputOpen = 220,  ///< 开启下行音频输出
    kHtpQueryStopMicCamera = 221,       ///< 停止MIC-摄像头测试
    kHtpQueryPhotosensitive = 222,      ///< 光敏测试
    kHtpQueryMeshTest = 223,            ///< MESH测试
    kHtpQueryGetProductModel = 224,     ///< 获取产品模式
    kHtpQuerySetHandMi = 225,           ///< 切换产品为手咪模式
    kHtpQueryWifiNetTest = 226,         ///< WIFI网络测试
    kHtpQueryEepromTest = 227,          ///< EEPROM测试
    kHtpQueryChargeTest = 228,          ///< 充电检测
    kHtpQueryHaveEncryptionChip = 229,  ///< 加密芯片是否存在
    kHtpQueryHaveRecoveryFlash = 230,   ///< 灾备存储器是否存在
    kHtpQueryCtrlOutDormancy = 231,     ///< 控制不进入休眠
    kHtpQueryCtrlInDormancy = 232,      ///< 控制进入休眠
    kHtpQuerySdNandTest = 233,          ///< SDNAND检测
    kHtpQueryTemperatureTest = 234,     ///< 温度检测
    kHtpQueryQuadratureEncoder = 235,   ///< 正交编码器检测
    kHtpQueryLoraModuleTest = 236,      ///< Lora模块检测
    kHtpQuerySetDevId = 237,            ///< 设置终端号
    kHtpQueryCameraTest = 238,          ///< 摄像头测试
};
typedef enum THtpCmdQueryTypeTag THtpCmdQueryType;

/**
 * 控制类型枚举
 */
enum THtpCmdCtrlTypeTag
{
    kHtpCtrlTestStorage = 0,             ///< 存储测试
    kHtpCtrlSetTestStatus = 1,           ///< 设置测试状态
    kHtpCtrlSetDevMode = 2,              ///< 设置终端模式
    kHtpCtrlPlayFile = 3,                ///< 播放指定文件
    kHtpCtrlCE = 4,                      ///< 返回CE
    kHtpCtrlTestCAN = 5,                 ///< CAN 测试
    kHtpCtrlCameraSnap = 6,              ///< 抓拍
    kHtpCtrlLockCar = 7,                 ///< 锁车控制
    kHtpCtrlADPower = 8,                 ///< AD 电源控制
    kHtpCtrlPrint = 9,                   ///< 打印
    kHtpCtrlSettingTime = 10,            ///< 设置时间
    kHtpCtrlKeyOnScreen = 11,            ///< 按键界面控制
    kHtpCtrlHHChannel = 12,              ///< 控制 HH 通道
    kHtpCtrlBoxId = 13,                  ///< 终端号
    kHtpCtrlEnterTestMode = 14,          ///< 终端进入自测模式
    kHtpCtrlStartCalib = 20,             ///< 开始标定
    kHtpCtrlRelay1 = 21,                 ///< 控制继电器1
    kHtpCtrlRelay2 = 22,                 ///< 控制继电器2
    kHtpCtrlWrite3CSpeed = 23,           ///< 3C 车速写入
    
    kHtpCtrlTboxWifiOpen = 135,          ///< TBOX系列WIFI打开
    kHtpCtrlTboxWifiClose = 138,         ///< TBOX系列WIFI关闭
    kHtpCtrlTboxBluetoothOpen = 139,     ///< TBOX系列蓝牙打开
    kHtpCtrlTboxBluetoothClose = 141,    ///< TBOX系列蓝牙关闭
};
typedef enum THtpCmdCtrlTypeTag THtpCmdCtrlType;

/**
 * 串口协议应答结果码
 */
enum kHtpMsgAckRstTag
{
    kHtpMsgAckRstOk              = 0, ///< 成功/确认
    kHtpMsgAckRstFailed          = 1, ///< 失败
    kHtpMsgAckRstMsgError        = 2, ///< 消息有误
    kHtpMsgAckRstNotSupport      = 3, ///< 不支持
    kHtpMsgAckRstCrcError        = 4, ///< CRC 校验错误
    kHtpMsgAckRstFileSizeError   = 5, ///< 文件尺寸错误
    kHtpMsgAckRstFileNotExist    = 6  ///< 文件不存在
};
typedef enum kHtpMsgAckRstTag kHtpMsgAckRst;

/**
 * 串口协议解析错误码
 */
enum kHtpDecodeErrorCodeTag
{
    kHtpDecodeOk = 0,
    kHtpDecodeParamError  = -1,     ///< 参数错误
    kHtpDecodeDlcTooLong  = -2,     ///< 数据长度过长
    kHtpDecodeMoreData    = -3,     ///< 需要继续缓存数据
    kHtpDecodeXorWrong    = -4,     ///< 校验出错
    kHtpDecodeInvaildHead = -5,     ///< 未查找到有效标记头
    kHtpDecodeNotSupport  = -6,     ///< 指令不支持
    kHtpDecodeNotSupportSub  = -7,  ///< 命令子项不支持
    kHtpDecodeGetDataFailed  = -8,  ///< 获取终端数据失败
    kHtpDecodeMoreMemory     = -9,  ///< 空间不足
};
typedef enum kHtpDecodeErrorCodeTag kHtpDecodeErrorCode;

#pragma pack(push, 1)
/**
 * 串口协议头
 */
typedef struct THtpMsgHeadTag THtpMsgHead;
struct THtpMsgHeadTag
{
    Byte proto_flag; ///< 消息起始标记 固定为0x51
    Byte cmd;        ///< 命令码 参见 THtpCmd
    Byte dlc_lo;     ///< 协议数据长度低字节
    Byte dlc_hi;     ///< 协议数据长度高字节
    Byte src;        ///< 源地址
    Byte dst;        ///< 目标地址
    Byte xor_code;   ///< 校验码
    Byte reserved;   ///< 预留
};

/**
 * 通用应答消息头
 */
typedef struct THtpGeneralAckHeadTag THtpGeneralAckHead;
struct THtpGeneralAckHeadTag
{
    THtpMsgHead  head;       ///< 消息头
    Byte      ack_cmd;       ///< 应答命令
    Byte      result;        ///< 应答结果
};

#pragma pack(pop)

/**
 * 测试消息
 */
typedef struct THtpMsgTag THtpMsg;
struct THtpMsgTag
{
    Byte  cmd;         ///< 命令字  参见 THtpCmd
    Byte  src_addr;    ///< 源节点
    Byte  dst_addr;    ///< 目标节点
    Word  load_len;    ///< 有效荷载长度
    Byte  *payload;    ///< 有效荷载内容   
};

/**
 * 查询指令请求消息体
 */
typedef struct THtpQueryReqBodyTag THtpQueryReqBody;
struct THtpQueryReqBodyTag
{
    DWord sub_type;     ///< 查询子类型
};

/**
 * 查询指令应答消息体
 */
typedef struct THtpQueryAckBodyTag THtpQueryAckBody;
struct THtpQueryAckBodyTag
{
    DWord sub_type;     ///< 查询子类型
    DWord ack_result;   ///< 查询应答结果
};

/**
 * 控制指令请求/应答消息体
 */
typedef struct THtpCtrlBodyTag THtpCtrlReqBody;
typedef struct THtpCtrlBodyTag THtpCtrlAckBody;
struct THtpCtrlBodyTag
{
    DWord sub_type;  ///< 控制类型
    DWord param1;    ///< 控制参数1
    DWord param2;    ///< 控制参数2
};

#pragma pack(push, 1)
/**
 * 通用应答
 */
typedef struct THtpGeneralAckMsgTag THtpGeneralAckMsg;
struct THtpGeneralAckMsgTag
{
    Byte ack_cmd;       ///< 应答命令 参见 THtpCmd
    Byte ack_result;    ///< 应答结果 参见 kHtpAckRst
    Byte src_addr;      ///< 源节点
    Byte dst_addr;      ///< 目标节点  
};

#pragma pack(pop)
/**
 * 消息帧解码
 * @param buffer: 数据缓存
 * @param length: 数据长度
 * @param msg: 解析出的消息帧 
 *             note: msg 中的 payload 指向buffer中的数据部分。先解析完毕后，再删除缓存pop_size长度。
 * @param pop_size: 可删除字节长度 
 * @return 错误码 参见 kHtpDecodeError
 */
Int32 HtpFrameDecode(const Byte *buffer, Int32 length, THtpMsg *msg, Int32 *pop_size);

/**
 * 解析查询请求
 * @param payload: 有效荷载 对应 THtpMsg 中的 payload
 * @param load_len: 荷载长度
 * @param req: 解析后的消息体 外部分配传入
 * @return True：成功 False: 失败
 */
Bool HtpCmdQueryParse(Byte *payload, Word load_len, THtpQueryReqBody *req);
/**
 * 解析控制请求
 * @param payload: 有效荷载 对应 THtpMsg 中的 payload
 * @param load_len: 荷载长度
 * @param req: 解析后的消息体 外部分配传入
 * @return True：成功 False: 失败
 */
Bool HtpCmdCtrlParse(Byte *payload, Word load_len, THtpCtrlReqBody *req);

/**
 * 通用应答编码
 * @param ack: 应答数据
 * @param result_ex: 通用应答附加数据缓存
 * @param ex_len: 通用应答附加数据长度
 * @param dst_buf: 传输数据缓存 外部分配
 * @param dst_len: 传输数据长度
 * @return 编码后，实际使用消息帧长度，即占用dst_buf的长度
 */
Int32 HtpGeneralAckEncode(THtpGeneralAckMsg *ack, Byte *result_ex, Int32 ex_len, Byte *dst_buf, Int32 dst_len);

#ifdef __cplusplus
}
#endif

#endif ///< _HFT_PROTO_H_

/** @} */
